import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import org.xml.sax.*; 
import java.io.*; 

import edu.mit.csail.sdg.alloy4compiler.translator.A4Solution;
import edu.mit.csail.sdg.alloy4.Err;

//Cette classe est chargee de cree le fichier ALS a partir des donnees utilisateurs (GET ou POST)
public class EmploiDuTemps {

	A4Solution solution = null;

	public EmploiDuTemps(){
                System.out.println("EmploiDuTemps : EMPLOI DU TEMPS CREE");
	}

	private void afficherEmploiDuTemps(){ 
		Afficheur.afficheEmploiDuTemps();
	} 


	public void solutionSansContraintes(){
//On genere le fichier als
		boolean detruit = new File(PlanbycoServer.CHEMINALS+"aCompiler.als").delete(); 
System.out.println("EmploiDuTemps : Old file destroy : " + detruit);
		NodeList partiesFixModele = DOM.getPartiesFix(PlanbycoServer.CHEMINXML+"edt-un-compose.xml", "partieFix");
		
		for (int i=0;i<partiesFixModele.getLength();i++){
			Node partieFix = partiesFixModele.item(i);
			String textContentPartieFix = partieFix.getTextContent();
			FileHandler.ecrire(PlanbycoServer.CHEMINALS+"aCompiler.als", textContentPartieFix);
		}

//on compile le .ALS 
                try { 
	                this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINALS + "aCompiler.als"}); 
                } 
                catch (Exception ex) { 
			System.out.println("EmploiDuTemps : Probleme Parsing"); 
		}

//on affiche
		this.afficherEmploiDuTemps();
	}
        

	public void ajouterContrainteSurProf(String[] get){

//On genere le fichier als
		boolean detruit = new File(PlanbycoServer.CHEMINALS+"aCompiler.als").delete(); 
System.out.println("EmploiDuTemps : Old file destroy : " + detruit);
		NodeList partiesFixModele = DOM.getPartiesFix(PlanbycoServer.CHEMINXML+"edt-un-compose.xml", "partieFix");

		//On ecrit la premiere partie du modele edt-un-compose (sans contraintes)
		Node partieFixModele = partiesFixModele.item(0);
		String textContentPartieFix = partieFixModele.getTextContent();
		FileHandler.ecrire(PlanbycoServer.CHEMINALS+"aCompiler.als", textContentPartieFix);

		//on cherche la contrainte demande et on rempli les trous
		NodeList partiesFixContrainte = DOM.getPartiesFix(PlanbycoServer.CHEMINXML+"contrainte.xml", "partieFix");
		for (int i=0;i<partiesFixContrainte.getLength();i++){
			Node partieFix = partiesFixContrainte.item(i);
			textContentPartieFix = partieFix.getTextContent();
			FileHandler.ecrire(PlanbycoServer.CHEMINALS+"aCompiler.als", textContentPartieFix);
//System.out.println("SONDE");
			if (i<partiesFixContrainte.getLength()-1){
				//pour chaque trou, il y a une valeurs dans le get
				if (get.length>1){
					FileHandler.ecrire(PlanbycoServer.CHEMINALS+ "aCompiler.als", get[i].split("=")[1]);
				}else{
					FileHandler.ecrire(PlanbycoServer.CHEMINALS+ "aCompiler.als", "SONDE");
				}
			}
		}
		
		//On ecrit la derniere partie du modele edt-un-compose(le run{})
		partieFixModele = partiesFixModele.item(1);
		textContentPartieFix = partieFixModele.getTextContent();
		FileHandler.ecrire(PlanbycoServer.CHEMINALS+"aCompiler.als", textContentPartieFix);

//on compile le .ALS 
                try { 
	                this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINALS + "aCompiler.als"}); 
                } 
                catch (Exception ex) { 
			System.out.println("EmploiDuTemps : Probleme Parsing"); 
		} 
		
//on affiche
System.out.println("EmploiDuTemps : SONDE");		
		this.afficherEmploiDuTemps();
	}
        
	public void next() {
//on recherche une solution alternative 
		A4Solution solTemporaire = this.solution;
		try { 
		    solTemporaire = this.solution.next();
		}catch (Exception ex) { 
		    System.out.println("EmploiDuTemps : Probleme Parsing next"); 
		}

		if (solTemporaire.satisfiable()){
		    try { 
			solTemporaire.writeXML(PlanbycoServer.CHEMINXML+"alloyResultat.xml");
			this.solution = solTemporaire;
		    }catch (Exception execption){ 
			System.out.println("EmploiDuTemps : probleme ecriture fichier xml resultat de la compile alloy");
		    }
		    this.solution=solTemporaire;
		}else {
		    System.out.println("EmploiDuTemps : snext solution not satisfiable");
		}
//on affiche
System.out.println("EmploiDuTemps : SONDE");		
		this.afficherEmploiDuTemps();
	}
}
